package cn.fansunion.leecode.number;

/**
 * 747. 至少是其他数字两倍的最大数 <br/>给你一个整数数组 nums ，其中总是存在 唯一的 一个最大整数 。
 * 
 * 请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是，则返回 最大元素的下标 ，否则返回 -1 。
 * 
 *  
 * 
 * 来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/largest-number-at-least-twice-of-others
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * 
 * @author wen.lei@brgroup.com
 *
 *         2022-2-26
 */
public class LargestNumberAtLeastTwiceOfOthers {
    /*示例 1：
    
    输入：nums = [3,6,1,0]
    输出：1
    解释：6 是最大的整数，对于数组中的其他整数，6 至少是数组中其他元素的两倍。6 的下标是 1 ，所以返回 1 。
    示例 2：
    
    输入：nums = [1,2,3,4]
    输出：-1
    解释：4 没有超过 3 的两倍大，所以返回 -1 。
    示例 3：
    
    输入：nums = [1]
    输出：0
    解释：因为不存在其他数字，所以认为现有数字 1 至少是其他数字的两倍。
     
    
    提示：
    
    1 <= nums.length <= 50
    0 <= nums[i] <= 100
    nums 中的最大元素是唯一的*/
    /**
     * 遍历数组，找出最大值max和第2大值secondMax，判断最大值max>=2*secondMax；其它特殊情况判断
     * 一道简单题，错了2次
     * @param nums
     * @return
     */
    public int dominantIndex(int[] nums) {
        if (nums == null) {
            return -1;
        }
        if (nums.length == 1) {
            return 0;
        }
        int maxIndex = -1;
        int max = -1;
        int secondMax = -1;
        int num = 0;
        for (int index = 0; index < nums.length; index++) {
            num = nums[index];
            // 最大值
            final boolean findMax = num > max && num > secondMax;
            final boolean findSecondMax = num < max && num > secondMax;
            if (findMax) {
                //当前num为最大值时，之前的最大值就成了第2大值
                //先更新secondMax
                secondMax=max;
                max = num;
                maxIndex = index;
            } else if (findSecondMax) {
                secondMax = num;
            }
        }
        if (max >= 2 * secondMax) {
            return maxIndex;
        }
        return -1;

    }

    // 解法错误
    // [2,3,4,7,11]，遍历完成时，最大值是11，最小值还是-1
    //忽略了第1个if对第2个if的影响，
    public int dominantIndexError(int[] nums) {
        if (nums == null) {
            return -1;
        }
        if (nums.length == 1) {
            return 0;
        }
        int maxIndex = -1;
        int max = -1;
        int secondMax = -1;
        int num = 0;
        for (int index = 0; index < nums.length; index++) {
            num = nums[index];
            // 最大值
            if (num > max && num > secondMax) {
                max = num;
                maxIndex = index;
            }
            // 第2大值
            if (num < max && num > secondMax) {
                secondMax = num;
            }
        }
        if (max >= 2 * secondMax) {
            return maxIndex;
        }
        return -1;

    }
}
